From: kaf24@firebug.cl.cam.ac.uk Date: Fri, 1 Sep 2006 00:07:45 +0000 (+0100) Subject: [XEN] Include CR2 and CR4 in register dumps. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~15673^2~5 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=9f5c2cdc38444656e627d88be9228c0dff29e093;p=xen.git [XEN] Include CR2 and CR4 in register dumps. Signed-off-by: Jan Beulich --- diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 7e1c0fdae4..59ccbb1dd0 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -243,6 +243,7 @@ static void svm_store_cpu_guest_regs( { /* Returning the guest's regs */ crs[0] = v->arch.hvm_svm.cpu_shadow_cr0; + crs[2] = v->arch.hvm_svm.cpu_cr2; crs[3] = v->arch.hvm_svm.cpu_cr3; crs[4] = v->arch.hvm_svm.cpu_shadow_cr4; } diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 3ffebedb9c..b5990d91e3 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -520,6 +520,7 @@ static void vmx_store_cpu_guest_regs( if ( crs != NULL ) { __vmread(CR0_READ_SHADOW, &crs[0]); + crs[2] = v->arch.hvm_vmx.cpu_cr2; __vmread(GUEST_CR3, &crs[3]); __vmread(CR4_READ_SHADOW, &crs[4]); } diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 7d188ceef3..c11adb2779 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -339,7 +339,6 @@ void show_execution_state(struct cpu_user_regs *regs) asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs) { int cpu = smp_processor_id(); - unsigned long cr2; static char *trapstr[] = { "divide error", "debug", "nmi", "bkpt", "overflow", "bounds", "invalid opcode", "device not available", "double fault", @@ -356,7 +355,7 @@ asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs) if ( trapnr == TRAP_page_fault ) { - __asm__ __volatile__ ("mov %%cr2,%0" : "=r" (cr2) : ); + unsigned long cr2 = read_cr2(); printk("Faulting linear address: %p\n", _p(cr2)); show_page_walk(cr2); } @@ -911,7 +910,7 @@ asmlinkage int do_page_fault(struct cpu_user_regs *regs) ASSERT(!in_irq()); - __asm__ __volatile__ ("mov %%cr2,%0" : "=r" (addr) : ); + addr = read_cr2(); DEBUGGER_trap_entry(TRAP_page_fault, regs); diff --git a/xen/arch/x86/x86_32/traps.c b/xen/arch/x86/x86_32/traps.c index 8d8f466bca..49b17b3793 100644 --- a/xen/arch/x86/x86_32/traps.c +++ b/xen/arch/x86/x86_32/traps.c @@ -35,20 +35,26 @@ void show_registers(struct cpu_user_regs *regs) } else { - context = guest_mode(regs) ? "guest" : "hypervisor"; - if ( !guest_mode(regs) ) { + context = "hypervisor"; fault_regs.esp = (unsigned long)®s->esp; fault_regs.ss = read_segment_register(ss); fault_regs.ds = read_segment_register(ds); fault_regs.es = read_segment_register(es); fault_regs.fs = read_segment_register(fs); fault_regs.gs = read_segment_register(gs); + fault_crs[2] = read_cr2(); + } + else + { + context = "guest"; + fault_crs[2] = current->vcpu_info->arch.cr2; } fault_crs[0] = read_cr0(); fault_crs[3] = read_cr3(); + fault_crs[4] = read_cr4(); } printk("----[ Xen-%d.%d%s %s ]----\n", @@ -63,7 +69,8 @@ void show_registers(struct cpu_user_regs *regs) fault_regs.eax, fault_regs.ebx, fault_regs.ecx, fault_regs.edx); printk("esi: %08x edi: %08x ebp: %08x esp: %08x\n", fault_regs.esi, fault_regs.edi, fault_regs.ebp, fault_regs.esp); - printk("cr0: %08lx cr3: %08lx\n", fault_crs[0], fault_crs[3]); + printk("cr0: %08lx cr4: %08lx cr3: %08lx cr2: %08lx\n", + fault_crs[0], fault_crs[4], fault_crs[3], fault_crs[2]); printk("ds: %04x es: %04x fs: %04x gs: %04x " "ss: %04x cs: %04x\n", fault_regs.ds, fault_regs.es, fault_regs.fs, diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index 0c08101d72..5b8924a26a 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -35,9 +35,20 @@ void show_registers(struct cpu_user_regs *regs) } else { - context = guest_mode(regs) ? "guest" : "hypervisor"; + if ( guest_mode(regs) ) + { + context = "guest"; + fault_crs[2] = current->vcpu_info->arch.cr2; + } + else + { + context = "hypervisor"; + fault_crs[2] = read_cr2(); + } + fault_crs[0] = read_cr0(); fault_crs[3] = read_cr3(); + fault_crs[4] = read_cr4(); fault_regs.ds = read_segment_register(ds); fault_regs.es = read_segment_register(es); fault_regs.fs = read_segment_register(fs); @@ -62,8 +73,9 @@ void show_registers(struct cpu_user_regs *regs) fault_regs.r9, fault_regs.r10, fault_regs.r11); printk("r12: %016lx r13: %016lx r14: %016lx\n", fault_regs.r12, fault_regs.r13, fault_regs.r14); - printk("r15: %016lx cr0: %016lx cr3: %016lx\n", - fault_regs.r15, fault_crs[0], fault_crs[3]); + printk("r15: %016lx cr0: %016lx cr4: %016lx\n", + fault_regs.r15, fault_crs[0], fault_crs[4]); + printk("cr3: %016lx cr2: %016lx\n", fault_crs[3], fault_crs[2]); printk("ds: %04x es: %04x fs: %04x gs: %04x " "ss: %04x cs: %04x\n", fault_regs.ds, fault_regs.es, fault_regs.fs, diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h index 196a5bc5bc..09ecfab041 100644 --- a/xen/include/asm-x86/processor.h +++ b/xen/include/asm-x86/processor.h @@ -290,6 +290,13 @@ static inline void write_cr0(unsigned long val) __asm__("mov %0,%%cr0": :"r" ((unsigned long)val)); } +static inline unsigned long read_cr2(void) +{ + unsigned long __cr2; + __asm__("mov %%cr2,%0\n\t" :"=r" (__cr2)); + return __cr2; +} + static inline unsigned long read_cr4(void) { unsigned long __cr4;